// 属性是可选的
let b: { name: string; age?: number };
// b对象中包含name属性，name属性的类型是string
b = { name: "zhangsan" };

let c: {
  name: string;
  /**
   * propName 是变量名，
   * [propName: string]: any表示任意类型的属性
   */
  [propName: string]: any;
};
c = { name: "猪八戒", a: 1, b: 2 };

/**
 * 函数类型
 * 参数a和参数b是number类型，返回值也是number类型
 * 设置函数结构的类型声明
 */
let d: (a: number, b: number) => number;
d = function (n1, n2) {
  return n1 + n2;
};

// string[] 字符串数组
let strList: string[];
let str2List: Array<string>;

let list: Array<object>;
list = [{ label: "选项1" }];

/**
 * 元祖 元祖就是固定长度的数组
 * 不能多也不能少，类型是固定的
 */
let tuple: [string, number];
tuple = ["zhangsan", 1];

/**
 * enum 枚举
 */
enum Gender {
  // 男
  Male = 0,
  // 女
  Female = 1,
}
let person: { name: string; gender: Gender };
person = {
  name: "张三",
  gender: Gender.Male,
};
console.log(Gender[0]);
console.log(person.gender === Gender.Male);

/**
 * &表示同时
 * 变量j既要有name（类型为string）又要有age（类型为number）
 */
let j: { name: string } & { age: number };
j = { name: "张三", age: 20 };

// 类型的别名
type myType = string | number;
let m: myType;
let k: myType;
m = "zhangsan";
k = 20;
